package com.gitee.cashzhang.test.basic.thread;

/**
 * @author Cash Zhang
 * @version v1.0
 * @since 2019/05/23 13:57
 */
public class SleepWait {

  public static void main(String[] args) throws InterruptedException {
    Thread thread1 = new Thread(() -> {
      synchronized(SleepWait.class){
        System.out.println("enter thread1...");
        System.out.println("thread1 is waiting...");
        try {
          //调用wait()方法，线程会放弃对象锁，进入等待此对象的等待锁定池
          SleepWait.class.wait();
        } catch (Exception e) {
          e.printStackTrace();
        }
        System.out.println("thread1 is going on ....");
        System.out.println("thread1 is over!!!");
      }
    });
    Thread thread2 = new Thread(() -> {
      synchronized (SleepWait.class) {
        System.out.println("enter thread2....");
        System.out.println("thread2 is sleep....");
        //只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。
        SleepWait.class.notify();
        //==================
        //区别
        //如果我们把代码：SleepWait.class.notify();给注释掉，即SleepWait.class调用了wait()方法，但是没有调用notify()
        //方法，则线程永远处于挂起状态。
        try {
          //sleep()方法导致了程序暂停执行指定的时间，让出cpu该其他线程，
          //但是他的监控状态依然保持者，当指定的时间到了又会自动恢复运行状态。
          //在调用sleep()方法的过程中，线程不会释放对象锁。
          Thread.sleep(5000);
        } catch (Exception e) {
          e.printStackTrace();
        }
        System.out.println("thread2 is going on....");
        System.out.println("thread2 is over!!!");
      }
    });
    thread1.start();
    Thread.sleep(5000);
    thread2.start();
  }
}
